package com.xzqwjw.taskmanager.adapter;

import java.util.ArrayList;
import java.util.List;

import com.leaderinfo.model.UnitNode;
import com.xzqwjw.taskmanager.view.ListItemUnitTreeView;
import com.leaderinfo.leaderinfojxyz.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TextView;

public class UnitNodeRBAdapter extends BaseAdapter {
	private LayoutInflater objLInflater;
	@SuppressWarnings("unused")
	private ListView lvUnitTree;
	private List<UnitNode> listAllNodeCache = new ArrayList<UnitNode>();
	private List<UnitNode> listAllNode = new ArrayList<UnitNode>();
	// �Ƿ�ӵ�е�ѡ��
	private boolean boolHasRadioButton = false;
	// �Ƿ�ӵ�и�ѡ��
	private boolean boolHasCheckBox = false;
	private int intIconExpanded = -1;
	private int intIconCollapsed = -1;
	// ѡ��position
	//private int intSelectedRButtonPosition = -1;

	public UnitNodeRBAdapter(Context objContext, UnitNode nodeRoot,
                           ListView lvUnitTree) {
		this.objLInflater = (LayoutInflater) objContext
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		this.lvUnitTree = lvUnitTree;
		addNode(nodeRoot);

	}

	@Override
	public int getCount() {
		if (listAllNode == null)
			return 0;
		else
			return listAllNode.size();
	}

	@Override
	public Object getItem(int intPosition) {
		if (listAllNode == null)
			return null;
		else
			return listAllNode.get(intPosition);
	}

	@Override
	public long getItemId(int intPosition) {
		return intPosition;
	}

	@Override
	public View getView(final int intPosition, View viewConvert,
			ViewGroup vgParent) {
		if (listAllNode == null) {
			return null;
		}
		// ÿ�ζ����»�ȡView
		ListItemUnitTreeView objViewHolder = new ListItemUnitTreeView();
		if (viewConvert == null) {
			viewConvert = this.objLInflater.inflate(R.layout.item_unit_tree,
					null);
			objViewHolder.rbSelect = (RadioButton) viewConvert
					.findViewById(R.id.rbSelect);
			objViewHolder.cbSelect = (CheckBox) viewConvert
					.findViewById(R.id.cbSelect);
			objViewHolder.ivIcon = (ImageView) viewConvert
					.findViewById(R.id.ivIcon);
			objViewHolder.tvText = (TextView) viewConvert
					.findViewById(R.id.tvText);
			objViewHolder.ivFlagEC = (ImageView) viewConvert
					.findViewById(R.id.ivFlagEC);
			viewConvert.setTag(objViewHolder);
		} else {
			objViewHolder = (ListItemUnitTreeView) viewConvert.getTag();
		}
		// ��position��ΪradioButton��id
		// objViewHolder.rbSelect.setId(intPosition);
		//
		// objViewHolder.rbSelect
		// .setOnCheckedChangeListener(new OnCheckedChangeListener() {
		// public void onCheckedChanged(CompoundButton objCpdButton,
		// boolean boolIsChecked) {
		// if (boolIsChecked) {
		// // intSelectedRbuttonPosition��������һ����ѡ�е�RB��ֵ��Ҫ�Ȱ���һ��RB���ó�false
		// if (intSelectedRButtonPosition != -1) {
		// RadioButton objRB = (RadioButton) lvUnitTree
		// .findViewById(intSelectedRButtonPosition);
		// if (objRB != null) {
		// objRB.setChecked(false);
		// }
		// }
		// // Ȼ�����������ڵ�RBΪѡ��״̬
		// intSelectedRButtonPosition = objCpdButton.getId();
		// if (intSelectedRButtonPosition != -1) {
		// setNodeSelected(intSelectedRButtonPosition);
		// }
		// }
		// }
		// });
		//
		// // ����ʵ�ֵ�ѡ��ѡ�Ļ��ԣ�����˵�ѡ���Ƴ���Ļ��Χδѡ��״̬
		//
		// if (intPosition == intSelectedRButtonPosition) {
		// objViewHolder.rbSelect.setChecked(true);
		// } else {
		// objViewHolder.rbSelect.setChecked(false);
		// }

		// �õ���ǰ��Ļ���·��Ľڵ�
		UnitNode objNode = listAllNode.get(intPosition);

		if (objNode != null) {
			// �Ƿ���ʾ��ѡ��
			objViewHolder.rbSelect.setTag(objNode);
			objViewHolder.rbSelect.setChecked(objNode.isChecked());
			// ���ӿؼ�buttonʧȥ���� �������Ḳ�ǵ�item�Ľ��� ������item ���ᴥ����Ӧ��onItemClickʧЧ
			// objViewHolder.rbSelect.setFocusable(false);// �޴˾���item����Ӧ��
			// objViewHolder.rbSelect.setId(intPosition);
			if (objNode.hasRadioButton() && boolHasRadioButton)
				objViewHolder.rbSelect.setVisibility(View.VISIBLE);
			else
				objViewHolder.rbSelect.setVisibility(View.GONE);

			// �Ƿ���ʾ��ѡ��
			objViewHolder.cbSelect.setTag(objNode);
			objViewHolder.cbSelect.setChecked(objNode.isChecked());
			if (objNode.hasCheckBox() && boolHasCheckBox)
				objViewHolder.cbSelect.setVisibility(View.VISIBLE);
			else
				objViewHolder.cbSelect.setVisibility(View.GONE);

			// �Ƿ���ʾͼ��
			if (objNode.getIcon() == -1) {
				objViewHolder.ivIcon.setVisibility(View.GONE);
			} else {
				objViewHolder.ivIcon.setVisibility(View.VISIBLE);
				objViewHolder.ivIcon.setImageResource(objNode.getIcon());
			}

			// ��ʾ�ı�
			objViewHolder.tvText.setText(objNode.getText());

			if (objNode.isLeaf()) {
				// �����Ҷ�ڵ��� ����ʾչ�����۵�״̬ͼ��
				objViewHolder.ivFlagEC.setVisibility(View.GONE);
			} else {
				// ����ʱ�����ӽڵ�չ�����۵�,״̬ͼ��ı�
				objViewHolder.ivFlagEC.setVisibility(View.VISIBLE);
				if (objNode.isExpanded()) {
					if (intIconExpanded != -1)
						objViewHolder.ivFlagEC
								.setImageResource(intIconExpanded);
				} else {
					if (intIconCollapsed != -1)
						objViewHolder.ivFlagEC
								.setImageResource(intIconCollapsed);
				}
			}
			// ��������
			viewConvert.setPadding(30 * objNode.getLevel(), 0, 0, 0);

		}

		// if (intSelectedRButtonPosition != -1) {
		// setNodeSelected(intPosition);
		// }

		return viewConvert;
	}

	private void addNode(UnitNode objNode) {
		listAllNode.add(objNode);
		listAllNodeCache.add(objNode);
		if (objNode.isLeaf())
			return;
		for (int i = 0; i < objNode.getChildren().size(); i++) {
			addNode(objNode.getChildren().get(i));
		}
	}

	// �������ѡ�еĽڵ�
	public List<UnitNode> getSeletedNodes() {
		List<UnitNode> listNodes = new ArrayList<UnitNode>();
		for (int i = 0; i < listAllNodeCache.size(); i++) {
			UnitNode objNode = listAllNodeCache.get(i);
			if (objNode.isChecked()) {
				listNodes.add(objNode);
			}
		}
		return listNodes;
	}

	// ���ѡ�нڵ�
	public UnitNode getSeletedNode(int intPosition) {
		return listAllNode.get(intPosition);
	}

	// ���ƽڵ��չ�����۵�
	private void filterNode() {
		listAllNode.clear();
		for (int i = 0; i < listAllNodeCache.size(); i++) {
			UnitNode objNode = listAllNodeCache.get(i);
			if (!objNode.isParentCollapsed() || objNode.isRoot()) {
				listAllNode.add(objNode);
			}
		}
	}

	// ���ƽڵ��չ��������
	public void ExpandOrCollapse(int intPosition) {
		UnitNode objNode = listAllNode.get(intPosition);
		if (objNode != null) {
			if (!objNode.isLeaf()) {
				objNode.setExpanded(!objNode.isExpanded());
				filterNode();
				this.notifyDataSetChanged();
			}
		}
	}

	// �����Ƿ�ӵ�е�ѡ��
	public void setRadioButton(boolean boolHasRadioButton) {
		this.boolHasRadioButton = boolHasRadioButton;
	}

	// �����Ƿ�ӵ�и�ѡ��
	public void setCheckBox(boolean boolHasCheckBox) {
		this.boolHasCheckBox = boolHasCheckBox;
	}

	/**
	 * ����չ�����۵�״̬ͼ��
	 * 
	 * @param intIconExpanded
	 *            չ��ʱͼ��
	 * @param intIconCollapsed
	 *            �۵�ʱͼ��
	 */
	public void setExpandedCollapsedIcon(int intIconExpanded,
			int intIconCollapsed) {
		this.intIconExpanded = intIconExpanded;
		this.intIconCollapsed = intIconCollapsed;
	}

	/**
	 * ����չ������
	 * 
	 * @param intLevel
	 */
	public void setExpandLevel(int intLevel) {
		listAllNode.clear();
		for (int i = 0; i < listAllNodeCache.size(); i++) {
			UnitNode objNode = listAllNodeCache.get(i);
			if (objNode.getLevel() <= intLevel) {
				if (objNode.getLevel() < intLevel) {
					// �ϲ㶼����չ��״̬
					objNode.setExpanded(true);
				} else {
					// ���һ�㶼�����۵�״̬
					objNode.setExpanded(false);
				}
				listAllNode.add(objNode);
			}
		}
		this.notifyDataSetChanged();
	}

	// ������нڵ��ѡ��״̬Ϊfalse��Ȼ������������ѡ�еĽڵ�Ϊtrue
	public void setNodeSelected(int intSelectedPosition) {
		UnitNode objNode;
		if (intSelectedPosition >= 0) {
			for (int i = 0; i < listAllNode.size(); i++) {
				objNode = listAllNode.get(i);
				objNode.setChecked(false);
			}
			objNode = listAllNode.get(intSelectedPosition);
			objNode.setChecked(true);
		}
	}

}
